from common.custom_list_tools.ListHelper import ListHelper


class Enemy:
    def __init__(self, no, name, atk, dp, speed):
        self.no = no
        self.name = name
        self.atk = atk
        self.dp = dp
        self.speed = speed

    @property
    def no(self):
        return self.__no

    @no.setter
    def no(self, no):
        self.__no = no

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, name):
        self.__name = name

    @property
    def atk(self):
        return self.__atk

    @atk.setter
    def atk(self, atk):
        self.__atk = atk

    @property
    def dp(self):
        return self.__dp

    @dp.setter
    def dp(self, dp):
        self.__dp = dp

    @property
    def speed(self):
        return self.__speed

    @speed.setter
    def speed(self, speed):
        self.__speed = speed

    def __str__(self):
        return '%d,%s,%d,%d,%d' % (self.__no, self.__name, self.__atk, self.__dp, self.__speed)


list_enemy = [
    Enemy(101, '吸血鬼', 500, 20, 800),
    Enemy(102, '僵尸', 600, 30, 100),
    Enemy(103, '倭寇', 800, 100, 200),
    Enemy(104, '血玉蜘蛛', 1000, 0, 500)
]

# 查找所有死人
for item in ListHelper.find_all(list_enemy, lambda e: e.dp == 0):
    print(item)

# 查找编号是101的敌人
for item in ListHelper.find_all(list_enemy, lambda e: e.no == 101):
    print(item)

# 查找所有活人
for item in ListHelper.find_all(list_enemy, lambda e: e.dp > 0):
    print(item)
    print("-----")
# 计算所有敌人攻击力总和
sum_atk = ListHelper.sum_item_property(list_enemy, lambda e: e.atk)
print('攻击力总和' + str(sum_atk))

# 查找所有攻击速度在500~1000之间
for item in ListHelper.find_all(list_enemy, lambda e: 900 <= e.atk <= 1000):
    print(item)
print("-----")

# 查找所有敌人姓名
print(list(ListHelper.find_item_property(list_enemy, lambda e: e.name)))
print("----")
# 获取最后一个活人
print(ListHelper.find_end_condition(list_enemy, lambda e: e.dp > 0))
print("---")
# 获取攻击速度大于5的最后一个敌人
print(ListHelper.find_end_condition(list_enemy, lambda e: e.speed >= 500))
print("----")

# 删除所有死人
for item in ListHelper.delete_condition(list_enemy[:], lambda e: e.dp == 0):
    print(item)

# 删除编号是101的敌人
for item in ListHelper.delete_condition(list_enemy[:], lambda e: e.no == 101):
    print(item)

# 删除攻击力没有大于500的人
for item in ListHelper.delete_condition(list_enemy[:], lambda e: e.atk <= 500):
    print(item)
print("----")
# 获取血量最大的敌人
print(ListHelper.find_max_condition(list_enemy, lambda e: e.dp))

# 获取攻击力最强的
print(ListHelper.find_max_condition(list_enemy, lambda e: e.atk))
print("----")

# 按照血量升序排序
for item in ListHelper.sort_condition(list_enemy[:], lambda e: e.dp):
    print(item)
print("----")
# 按照攻击力升序排序
for item in ListHelper.sort_condition(list_enemy[:], lambda e: e.atk):
    print(item)

print("---")
# 查找血量在30~100之间的所有敌人
for item in filter(lambda e: 30 <= e.dp <= 100, list_enemy):
    print(item)
print("----")
# 查找所有敌人的攻击力
for atk in map(lambda e: e.atk, list_enemy):
    print(atk)
print("----")
# 根据攻击力对敌人列表进行升序排序
for item in sorted(list_enemy, key=lambda e: e.atk):
    print(item)

print("----")
# 查找名字长度最长的敌人
print(max(list_enemy, key=lambda e: e.name))

print("----")
# 获取攻击力最小的敌人
print(min(list_enemy, key=lambda e: e.atk))
print(ListHelper.find_min_condition(list_enemy, lambda e: e.atk))
print("----")

# 根据血量对敌人列表进行降序排序
# sorted返回一个新的列表，没有修改之前的列表。如果想要修改之前的列表，可以 之前列表[:] = sorted(...)
for item in sorted(list_enemy, key=lambda e: e.dp, reverse=True):
    print(item)
print("---")
for item in ListHelper.sort_condition(list_enemy, lambda e: e.dp, reverse=True):
    print(item)

print("----")
for item in ListHelper.sort_condition2(list_enemy, lambda e1, e2: e1.dp < e2.dp):
    print(item)
